//发送端
#include <QuickEspNow.h>  // 使用 QuickEspNow 库
#include <WiFi.h>

// 数据结构（必须和接收端一致）
typedef struct {
  uint8_t message;   // 固定数据（0x55）
  uint16_t counter;  // 递增计数器
} SendData;

SendData myData;
#define TRIGGER_PIN 0  // GPIO0 作为触发引脚
static const uint8_t channel = 5; //通道
// 初始化重试参数
int max_retries = 20;      // 最大重试次数
int retry_delay = 50;     // 重试间隔（ms）


// 防抖变量
const unsigned long debounceDelay = 200;  // //两次颠球的最短时间
uint16_t sendCounter = 0;                // 发送计数器
const uint8_t adr[] = {0x8C, 0x4F, 0x00, 0x36, 0xAA, 0xB4}; // 接收端 MAC 地址 8C:4F:00:36:AA:B4 ESPNOW_BROADCAST_ADDRESS

void setup() {
  Serial.begin(115200);
  pinMode(TRIGGER_PIN, INPUT_PULLDOWN);  // GPIO0 设置为下拉输入
  
  // 初始化数据
  myData.message = 0x55;
  myData.counter = 0;
  
  // 强制设置 Wi-Fi 通道为 5（与接收端一致）
  WiFi.mode (WIFI_MODE_STA);
  WiFi.disconnect (false, true);
  quickEspNow.setWiFiBandwidth(WIFI_IF_AP, WIFI_BW_HT20); 
  quickEspNow.begin(channel, WIFI_IF_STA);
  Serial.printf("当前quickEspNow信道: %d\n", WiFi.channel()); // 应为 2

  Serial.print("MAC Address: ");
  Serial.println(WiFi.macAddress());


}

void loop() {
  if (digitalRead(TRIGGER_PIN) == HIGH){
    // 更新计数器
    myData.counter = ++sendCounter;
    comms_send_error_t result = COMMS_SEND_CONFIRM_ERROR;
    // 循环重试发送
    for (int retry = 0; retry < max_retries; retry++) {
      result = quickEspNow.send(adr,(uint8_t *)&myData, sizeof(myData));
      if (result == COMMS_SEND_OK) {
        Serial.printf("发送数据到: " MACSTR, MAC2STR(adr));
        Serial.printf(" 成功！ %d，序号%d\n", result,myData.counter);
         break;  // 发送成功，退出循环
      } else {
        Serial.printf("发送失败！错误码: %d,序号：%d，剩余重试次数: %d\n", result,myData.counter, max_retries - retry - 1);
        delay(retry_delay);  // 等待后重试
      }
    }
    // 最终结果判断
    if (result != COMMS_SEND_OK) {
      Serial.println("10次重试后仍发送失败！");
    }
    //等待低电平
    while (digitalRead(TRIGGER_PIN) == HIGH) {
      delay(10);
    }
    delay(debounceDelay);//两次颠球的最短时间
  }
  //delay(10);
}